Language compilers can be configured to automatically generate code which parallelizes processing performed by a loop, providing a form of static compile-time parallelization. A system which runs this code can allocate different loop iterations to different processing resources (e.g., different threads or different processing cores on a single or multiple central processing units (CPUs)). The processing resources can operate on their respective tasks in a parallel manner to thereby expedite processing. However, compile-time parallelization techniques (which are applied before code is executed) face significant challenges in performing this task. For instance, a language compiler often lacks sufficient information to determine whether it is worthwhile to parallelize a loop. Further, a language compiler often lacks sufficient information to determine whether it is safe to parallelize a loop. In many cases, for example, loop iterations are dependent on other loop iterations. In these scenarios, the iterations are not parallelizable. However, the language compiler often has insufficient information to determine whether a loop has these non-parallelizable characteristics. Due to these limitations, the language compiler may opt to take a conservative approach in parallelizing code. This solution, however, may fail to provide significant gains in expediting the execution of the program.